package main

import "fmt"

/*
定义数组的格式：var <varName> [n]<type>，n>=0
数组长度也是类型的一部分，因此具有不同长度的数组为不同类型,因此a[2]不能赋值给b[1]
注意区分指向数组的指针和指针数组
数组在Go中为值类型	不像java是个对象，对象的引用，做参数传递时是“值传递”
数组之间可以使用==或!=（数组长度相同才可）进行比较，但不可以使用<或>
可以使用new来创建数组，此方法返回一个指向数组的指针
Go支持多维数组

*/
func main() {
	var a [10]int = [10]int{1, 2, 9: 9}
	fmt.Println("a: ", a)
	var a1 []int = []int{1, 2}
	fmt.Println("a1: ", a1)
	b := [20]int{1, 2}
	fmt.Println("b: ", b)

	c := []int{1, 2, 3}
	fmt.Println("c: ", c)

	//索引
	d := [20]int{18: 1, 19: 2}
	fmt.Println("d: ", d)

	e := []int{10: 2}
	fmt.Println("e: ", e)

	f := [...]int{9: 9}
	fmt.Println("f: ", f)
	//指向数组的指针
	g := []int16{10: 9, 20: 19, 30: 29}
	var p *[]int16 = &g
	fmt.Println("e.p: ", p, " ", *p)
	// 指针数组
	p1, p2, p3 := 1, 2, 3
	var pp []*int = []*int{&p1, &p2, &p3}
	fmt.Println("pp: ", pp, "/ pp[0]: ", pp[0], "/ *pp[0]", *pp[0])

	//
	var h []int = new([10]int)[:]
	fmt.Println("h: ", h)

	//new 的指向数组的指针可以使用索引
	h1 := new([10]int)
	h1[0] = 9
	fmt.Println("h1: ", h1, "/ h1[0]: ", h1[0])

	i := [][]int{{1, 2}, {1, 2, 3}, {1, 2, 3, 4}}    //[[1 2] [1 2 3] [1 2 3 4]]
	i1 := [4][4]int{{1, 2}, {1, 2, 3}, {1, 2, 3, 4}} //[[1 2 0 0] [1 2 3 0] [1 2 3 4] [0 0 0 0]]
	fmt.Println("i: ", i, i[1][2], "\n", "i1: ", i1, i1[3][3])
	//todo [...]int / [N]int 表示数组，方括号里不包含三个点的[]int 为Slice类型
	fmt.Println(i1[2][:2])
}
